package co.kr.caja.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.kr.caja.entidad.CajaDTO;
import co.kr.caja.entidad.UsuarioDTO;

public class CajaDAOSqlServer {

	private String crearCajaSQL;
	private String actualizarCajaSQL;
	private String consutarCajaCodigoSQL;
	private String consutarCajaComprobanteSQL;
	private String consultarCajaFechaSQL;
	private String consultarCajaTodoSQL;

	public CajaDAOSqlServer() {
		crearCajaSQL = "";
		actualizarCajaSQL = "";
		consutarCajaCodigoSQL = "";
		consutarCajaComprobanteSQL = "";
		consultarCajaFechaSQL = "";
		consultarCajaTodoSQL = "";
	}

	public void crear(CajaDTO cajaDTO, Connection conexion) throws SQLException {
		crearCajaSQL = "INSERT INTO Caja (descripcion, comprobante, tipo, fecha, importe, codigo_usuario) VALUES (?, ?, ?, ?, ?, ?)";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(crearCajaSQL)) {
			sentenciaPreparada.setString(1, cajaDTO.getDescripcion());
			sentenciaPreparada.setString(2, cajaDTO.getComprobante());
			sentenciaPreparada.setString(3, cajaDTO.getTipo());
			sentenciaPreparada.setString(4, cajaDTO.getFecha());
			sentenciaPreparada.setDouble(5, cajaDTO.getImporte());
			sentenciaPreparada.setInt(6, cajaDTO.getUsuarioDTO().getCodigoUsuario());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un probema creando el registro en la tabla Caja: " + excepcion.getMessage());
			throw excepcion;
		}
	}

	public void actualizar(CajaDTO cajaDTO, Connection conexion) throws SQLException {
		actualizarCajaSQL = "UPDATE Caja SET descripcion = ISNULL(?, descripcion), comprobante = ISNULL(?, comprobante), tipo = ISNULL(?, tipo), fecha = ISNULL(?, fecha), importe = ISNULL(?, importe), codigo_usuario = ISNULL(?, codigo_usuario) WHERE codigo_caja = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(actualizarCajaSQL)) {
			sentenciaPreparada.setString(1, cajaDTO.getDescripcion());
			sentenciaPreparada.setString(2, cajaDTO.getComprobante());
			sentenciaPreparada.setString(3, cajaDTO.getTipo());
			sentenciaPreparada.setString(4, cajaDTO.getFecha());
			sentenciaPreparada.setDouble(5, cajaDTO.getImporte());
			sentenciaPreparada.setInt(6, cajaDTO.getUsuarioDTO().getCodigoUsuario());
			sentenciaPreparada.setInt(7, cajaDTO.getCodigoCaja());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema actualizando el registro en la tabla Caja" + excepcion.getMessage());
			throw excepcion;
		}
	}

	public CajaDTO consultarPorCodigo(CajaDTO cajaDTO, Connection conexion) throws SQLException {
		CajaDTO cajaDTOResultado = null;
		consutarCajaCodigoSQL = "SELECT codigo_caja, descripcion, comprobante, tipo, fecha, importe, codigo_usuario FROM Caja WHERE Caja.codigo_caja = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consutarCajaCodigoSQL)) {
			sentenciaPreparada.setInt(1, cajaDTO.getCodigoCaja());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					cajaDTOResultado = new CajaDTO();
					cajaDTOResultado.setCodigoCaja(cursorResultado.getInt("codigo_caja"));
					cajaDTOResultado.setDescripcion(cursorResultado.getString("descripcion"));
					cajaDTOResultado.setComprobante(cursorResultado.getString("comprobante"));
					cajaDTOResultado.setTipo(cursorResultado.getString("tipo"));
					cajaDTOResultado.setFecha(cursorResultado.getString("fecha"));
					cajaDTOResultado.setImporte(cursorResultado.getDouble("importe"));
					UsuarioDTO usuarioDTO = new UsuarioDTO();
					usuarioDTO.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					cajaDTOResultado.setUsuarioDTO(usuarioDTO);
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Caja por codigo: " + excepcion.getMessage());
			throw excepcion;
		}
		return cajaDTOResultado;
	}

	public CajaDTO consultarPorComprobante(CajaDTO cajaDTO, Connection conexion) throws SQLException {
		CajaDTO cajaDTOResultado = null;
		consutarCajaComprobanteSQL = "SELECT codigo_caja, descripcion, comprobante, tipo, fecha, importe, codigo_usuario FROM Caja WHERE Caja.comprobante = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consutarCajaComprobanteSQL)) {
			sentenciaPreparada.setString(1, cajaDTO.getComprobante());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					cajaDTOResultado = new CajaDTO();
					cajaDTOResultado.setCodigoCaja(cursorResultado.getInt("codigo_caja"));
					cajaDTOResultado.setDescripcion(cursorResultado.getString("descripcion"));
					cajaDTOResultado.setComprobante(cursorResultado.getString("comprobante"));
					cajaDTOResultado.setTipo(cursorResultado.getString("tipo"));
					cajaDTOResultado.setFecha(cursorResultado.getString("fecha"));
					cajaDTOResultado.setImporte(cursorResultado.getDouble("importe"));
					UsuarioDTO usuarioDTO = new UsuarioDTO();
					usuarioDTO.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					cajaDTOResultado.setUsuarioDTO(usuarioDTO);
				}
			}
		} catch (SQLException excepcion) {
			System.out.println("Se ha presentado un problema consultando la tabla Caja por comprobante: " + excepcion.getMessage());
			throw excepcion;
		}
		return cajaDTOResultado;
	}

	public CajaDTO consultarPorFecha(CajaDTO cajaDTO, Connection conexion) throws SQLException {
		CajaDTO cajaDTOResultado = null;
		consultarCajaFechaSQL = "SELECT codigo_caja, descripcion, comprobante, tipo, fecha, importe, codigo_usuario FROM Caja WHERE Caja.fecha = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarCajaFechaSQL)) {
			sentenciaPreparada.setString(1, cajaDTO.getFecha());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					cajaDTOResultado = new CajaDTO();
					cajaDTOResultado.setCodigoCaja(cursorResultado.getInt("codigo_caja"));
					cajaDTOResultado.setDescripcion(cursorResultado.getString("descripcion"));
					cajaDTOResultado.setComprobante(cursorResultado.getString("comprobante"));
					cajaDTOResultado.setTipo(cursorResultado.getString("tipo"));
					cajaDTOResultado.setFecha(cursorResultado.getString("fecha"));
					cajaDTOResultado.setImporte(cursorResultado.getDouble("importe"));
					UsuarioDTO usuarioDTO = new UsuarioDTO();
					usuarioDTO.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					cajaDTOResultado.setUsuarioDTO(usuarioDTO);
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Caja por fecha: " + excepcion.getMessage());
			throw excepcion;
		}
		return cajaDTOResultado;
	}

	public ArrayList<CajaDTO> consultarTodo(Connection conexion) throws SQLException {
		ArrayList<CajaDTO> cajaDTOLista = new ArrayList<CajaDTO>();
		CajaDTO cajaDTOResultado = null;
		consultarCajaTodoSQL = "SELECT codigo_caja, descripcion, comprobante, tipo, fecha, importe, codigo_usuario FROM Caja";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarCajaTodoSQL)) {
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				while (cursorResultado.next()) {
					cajaDTOResultado = new CajaDTO();
					cajaDTOResultado.setCodigoCaja(cursorResultado.getInt("codigo_caja"));
					cajaDTOResultado.setDescripcion(cursorResultado.getString("descripcion"));
					cajaDTOResultado.setComprobante(cursorResultado.getString("comprobante"));
					cajaDTOResultado.setTipo(cursorResultado.getString("tipo"));
					cajaDTOResultado.setFecha(cursorResultado.getString("fecha"));
					cajaDTOResultado.setImporte(cursorResultado.getDouble("importe"));
					UsuarioDTO usuarioDTO = new UsuarioDTO();
					usuarioDTO.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					cajaDTOResultado.setUsuarioDTO(usuarioDTO);
					cajaDTOLista.add(cajaDTOResultado);
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando toda la tabla: " + excepcion.getMessage());
			throw excepcion;
		}
		return cajaDTOLista;
	}
}
